## Example of SLD (syndrome-leader decoding)

from PyM import *

def min_weight(X):
    return min([wt(x) for x in X])
    
def min_weights(X):
    m = min_weight(X)
    return [x for x in X if wt(x)==m]

def submatrix(M,J):
    return M[:,J]


B = Zn(2)

G = matrix(B,3,5)
G[0]=[1,1,0,0,1]
G[1]=[0,0,1,0,1]
G[2]=[1,0,0,1,1]

H = submatrix(G,[0,4])
H = stack(matrix(B,[[1,0]]),H)
H = stack(H,matrix(B,[[0,1]]))
H = transpose(H)

C = matrix([a0*G[0]+a1*G[1]+a2*G[2] for a0 in [0,1] for a1 in [0,1] for a2 in [0,1]])

X = {(a,b): matrix([vector([a,0,0,0,b])+x for x in C]) for a in [0,1] for b in [0,1]}

S = X.keys() # list of syndromes

M = {s:min_weights(X[s]) for s in S}

E = {s:M[s][0] for s in S}

# Disregarding the Vector[Z3] labels,
# E =>
# {(0,0): [0,0,0,0,0],
#  (0,1): [0,0,0,0,1],
#  (0,2): [0,0,0,0,2],
#  (1,0): [0,0,0,1,0],
#  (1,1): [1,0,0,0,0],
#  (1,2): [0,0,0,1,2],
#  (2,0): [0,0,0,2,0],
#  (2,1): [0,0,0,2,1],
#  (2,2): [2,0,0,0,0],
#  

y = vector([0,1,0,0,1])
s = y*transpose(H)
s =(lift(s[0]),lift(s[1]))
show('s:',s)
x = y-E[s]

show('y:',y)
show('x:',x)



